# 以开关文件对象举例  演示上下文管理器对象的使用

# 1.这是不用 上下文管理器的情况下，开关文件需要手动
# file = open('a.txt','w') # 用写的模式打开名为 a.txt的文件。这里没有该文件 就是在创建文件
# file.write('hello python') # 写入
# file.close()

# 2.上下文管理 处理文件开关 (这样就完成了，通过上下文管理器对象 + with 自动完成文件开关)  注：open('b.txt','w')返回的就是一个上下文管理对象
# with open('b.txt','w') as file:
#     file.write('hello python')  # 写入

# 3.自己实现一个 用于计算时间差的上下文管理器
import time
class Timer(): # 构造上下文管理器的类
    def __init__(self):
        self.timeGap = 0 # 初始化时间差值
    def __enter__(self): # 被包裹的代码块执行之前，要执行的函数
        self.startTime = time.perf_counter() # 记录开始的时候时钟的时间点
        return self # __enter__ 里面的返回值 就是 with 后面的那个 as 的值
    def __exit__(self, exc_type, exc_val, exc_tb): # 被包裹的代码块执行之后，要执行的函数
        self.endTime = time.perf_counter()  # 记录结束的时候时钟的时间点
        self.timeGap = self.endTime - self.startTime # 计算 时间差值

with Timer() as timer:
    arr = []
    for i in range(10000):
        arr.append(i ** 3)
print(timer.timeGap)
